<?php
// +----------------------------------------------------------------------
// | 全局函数
// +----------------------------------------------------------------------
// | Author: myh
// +----------------------------------------------------------------------

/**
 * 正则匹配手机号
 * @param  string     $mobile     手机号
 * @return bool
 */
function matchMobile($mobile){
    $pattern = '/^1[3-9]\d{9}$/';
    if (preg_match($pattern, $mobile)) {
        return true;
    } else {
        return false;
    }
}

/**
 * 密码加密
 * @param string $pw       要加密的原始密码
 * @param string $authCode 加密字符串
 * @return string
 */
function createPassword($pw, $authCode = '')
{
    if (empty($authCode)) {
        $authCode = config('app.authcode');
    }
    $result = "***" . md5(md5($authCode . $pw));
    return $result;
}


/**
 * 密码比较方法,所有涉及密码比较的地方都用这个方法
 * @param string $password     要比较的密码
 * @param string $passwordInDb 数据库保存的已经加密过的密码
 * @return boolean 密码相同，返回true
 */
function comparePassword($password, $passwordInDb)
{
    return createPassword($password) == $passwordInDb;
}


/**
 * 成功
 * @param string $code    错误码
 * @param string $msg     提示信息
 */
function success($data = []){
    return json(['code'=>200, 'msg'=>'操作成功','data'=>$data]);
}

/**
 * 失败
 * @param string $code    错误码
 * @param string $msg     提示信息
 */
function failure($code=201, $msg='操作失败'){
    return json(['code'=>$code, 'msg'=> $msg]);
}

/**
 * 异常
 * @param string $code    错误码
 * @param string $msg     提示信息
 */
function error(){
    return json(['code'=>500, 'msg'=>'服务器异常~']);
}

/**
 * 抛出异常
 * @param string $code    错误码
 * @param string $msg     提示信息
 */
function serviceException($code=500, $msg ='服务器异常~'){
    // 使用think自带异常类抛出异常
    throw new \app\CustomException($msg, $code);
}


/**
 * 获取客户端IP地址
 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字
 * @param boolean $adv  是否进行高级模式获取（有可能被伪装）
 * @return string
 */
function getClientIp($type = 0, $adv = true)
{
    return request()->ip($type, $adv);
}

/**
 * 获取登录用户id
 */
function getUserId(){
    return isset(request()->user['id']) ? request()->user['id'] : 0;
}

/**
 * 获取登录用户信息
 */
function getUserInfo(){
    return isset(request()->user) ? request()->user : [];
}

/**
 * 递归输出层级
 * @param array  $data      数据列表
 * @param array  $parentId  父级ID
 */
function treeMenu($data, $parentId=0){
    if(empty($data)) {
        return [];
    }

    $list = [];
    foreach ($data as $k => $v) {
        if($parentId == $v['parent_id']){
            $v['children'] = treeMenu($data,$v['id']);
            $list[] = $v;
        }
    }

    return $list;
}

/**
 * 递归输出层级
 * @param array  $data      数据列表
 * @param array  $parentId  父级ID
 */
function treeData($data, $parentId=0){
    if(empty($data)) {
        return [];
    }

    $list = [];
    foreach ($data as $v) {
        if($parentId == $v['parent_id']){
            $v['children'] = treeData($data,$v['id']);
            $list[] = $v;
        }
    }
    return $list;
}

/**
 * 递归输出上级
 * @param array  $data      数据列表
 * @param array  $id        ID
 * @param array  $result    保存的结果
 */
function reTreeData($data, $id, &$result) {
    foreach ($data as $v) {
        if ($v['id'] == $id) {
            $result[] = $v;
            if ($v['parent_id'] !== null) {
                reTreeData($data, $v['parent_id'], $result);
            }
            return;
        }
    }
}

/**
 * 递归输出上级
 * @param array  $data      数据列表
 * @param array  $id        ID
 * @param array  $result    保存的结果
 */
function outReTreeData($data, $id) {
    $res = [];
    reTreeData($data, $id, $res);
    return array_reverse($res);
}